/* CSP-201803P4 棋局评估（博弈、搜索）
时间限制：	1.0s
内存限制：	256.0MB

9个格子，双方总共最多走9步必然终局，DFS搜索最多递归9层。
因X先行，获胜最少需3个X，此时必然有2个O，剩4个空。理论上最高+5、最低-4分。
因X先行，根据棋局上X和O的数量就能判断轮到哪方下棋（数量相同应X下棋，X多则应O下）

每格3种状态：空(00)、X(01)、O(10)，需要2位表示。棋局共需2*9=18位，用int32可保存。
每种棋局视为一个状态，可编码得到其唯一标识。
最多3^9=19683种棋局。因部分棋局到达之前就已分出胜负，实际有效棋局更少。

每方各8种获胜终局（3横+3纵+2对角），可预先保存在数组W中。
判断某个状态S是否分出胜负，依次计算T=(S & W[i])。
如T==W[i]，说明获胜所需的棋子和位置已具备。

从每种棋局根据不同下法，指向不同的后继状态，形成一张博弈图。
不同下法可形成相同棋局，因此是图而不是树。
棋子只下、不收、不动，后继状态标识大于前驱状态，该图没有后向边，属有向无环图（DAG）
——这与象棋不同。

可以对每个棋局计算出得分，绘制博弈图展现。

预先算出各状态得分并存到表中，输入棋局后编码为标识，立即可查出得分，即“打表”做法。
*/
#include <fstream>
#include <iostream>
#include <map>
using namespace std;

const int win_states[3][8] = {
  {}, // 保留0不用，可直接索引1、2方。
  { 0b010101000000000000, 0b000000010101000000, 0b000000000000010101,
    0b010000010000010000, 0b000100000100000100, 0b000001000001000001,
    0b010000000100000001, 0b000001000100010000
  }, // A(1=0b01) win
  { 0b101010000000000000, 0b000000101010000000, 0b000000000000101010,
    0b100000100000100000, 0b001000001000001000, 0b000010000010000010,
    0b100000001000000010, 0b000010001000100000
  }  // B(2=0b10) win
};

bool win(int x, int state){
  for(int i = 0; i < 8; ++i){
    if((win_states[x][i] & state) == win_states[x][i]){
      return true;
    }
  }
  return false;
}

int check(int x, int state, int space){
  const int y = (x == 1 ? 2 : 1);
  if(win(x, state)){ return   space + 1; }
  if(win(y, state)){ return -(space + 1); }
  const int INF = -9;
  int mx = INF;
  for(int i = 0, m = 0b11; i < 18; i += 2, m <<= 2){
    if((state & m) == 0){ // 发现空白就递归搜索
      mx = max(mx, -check(y, (state | (x << i)), space - 1));
    }
  }
  return (mx == INF ? 0 : mx); // 若分数没有变动，双方都没取胜，平局。
}

int main(){
  int n = 0;
  cin >> n;
  for(; n; --n){
    int state = 0, space = 0;
    for(int r = 0, x; r < 9; ++r){
      cin >> x; // 0,1,2
      state |= x;
      state <<= 2;
      if(x == 0){ ++space; }
    }
    state >>= 2; // 读入时多左移了2位，修正
    cout << check(1, state, space) << endl; // 总是1号行棋。
  }
}
